
// author: niXman
// e-mail: i.nixman@gmail.com
// date: 28.05.2011
//
//
// Boost Software License - Version 1.0 - August 17th, 2003
//
// Permission is hereby granted, free of charge, to any person or organization
// obtaining a copy of the software and accompanying documentation covered by
// this license (the "Software") to use, reproduce, display, distribute,
// execute, and transmit the Software, and to prepare derivative works of the
// Software, and to permit third-parties to whom the Software is furnished to
// do so, all subject to the following:
//
// The copyright notices in the Software and this entire statement, including
// the above license grant, this restriction and the following disclaimer,
// must be included in all copies of the Software, in whole or in part, and
// all derivative works of the Software, unless such copies or derivative
// works are solely in the form of machine-executable object code generated by
// a source language processor.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.

#include <iostream>
#include <netclasses/socket.hpp>
#include <netclasses/acceptor.hpp>

#include "../tests_config.hpp"

struct server {
   server(boost::asio::io_service& ios, const char* ip, boost::uint16_t port)
      :acceptor(ios, ip, port)
   {
      acceptor.async_accept(this, &server::on_accept);
   }

   void on_accept(
      netclasses::socket_ptr socket,
      const boost::asio::ip::tcp::endpoint& ep,
      const boost::system::error_code& ec)
   {
      char buf[config::buffer_size] = "\0";

      std::cout
      << "new connection from: " << ep.address().to_string() << ":" << ep.port()
      << ", error = " << ec.message() << std::endl;

      socket->read(buf, config::buffer_size);
      socket->write(buf, config::buffer_size);
   }

private:
   netclasses::acceptor acceptor;
};

int main() {
   try {
      boost::asio::io_service ios;
      server server(ios, config::ip, config::port);
      ios.run();
   } catch ( const std::exception& e ) {
      std::cout << "(exception): " << e.what() << std::endl;
   }
}
